home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-installer.exe / bin / quopri.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2014-12-31  |  6KB  |  258 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. '''Conversions to/from quoted-printable transport encoding as per RFC 1521.'''
  5. __all__ = [
  6.     'encode',
  7.     'decode',
  8.     'encodestring',
  9.     'decodestring']
  10. ESCAPE = '='
  11. MAXLINESIZE = 76
  12. HEX = '0123456789ABCDEF'
  13. EMPTYSTRING = ''
  14.  
  15. try:
  16.     from binascii import a2b_qp, b2a_qp
  17. except ImportError:
  18.     a2b_qp = None
  19.     b2a_qp = None
  20.  
  21.  
  22. def needsquoting(c, quotetabs, header):
  23.     """Decide whether a particular character needs to be quoted.
  24.  
  25.     The 'quotetabs' flag indicates whether embedded tabs and spaces should be
  26.     quoted.  Note that line-ending tabs and spaces are always encoded, as per
  27.     RFC 1521.
  28.     """
  29.     if c in ' \t':
  30.         return quotetabs
  31.     return None if None == '_' else not None if c <= c else c <= '~'
  32.  
  33.  
  34. def quote(c):
  35.     '''Quote a single character.'''
  36.     i = ord(c)
  37.     return ESCAPE + HEX[i // 16] + HEX[i % 16]
  38.  
  39.  
  40. def encode(input, output, quotetabs, header = 0):
  41.     """Read 'input', apply quoted-printable encoding, and write to 'output'.
  42.  
  43.     'input' and 'output' are files with readline() and write() methods.
  44.     The 'quotetabs' flag indicates whether embedded tabs and spaces should be
  45.     quoted.  Note that line-ending tabs and spaces are always encoded, as per
  46.     RFC 1521.
  47.     The 'header' flag indicates whether we are encoding spaces as _ as per
  48.     RFC 1522.
  49.     """
  50.     if b2a_qp is not None:
  51.         data = input.read()
  52.         odata = b2a_qp(data, quotetabs = quotetabs, header = header)
  53.         output.write(odata)
  54.         return None
  55.     
  56.     def write(s, output = None, lineEnd = '\n'):
  57.         if s and s[-1:] in ' \t':
  58.             output.write(s[:-1] + quote(s[-1]) + lineEnd)
  59.         elif s == '.':
  60.             output.write(quote(s) + lineEnd)
  61.         else:
  62.             output.write(s + lineEnd)
  63.  
  64.     prevline = None
  65.     while None:
  66.         line = input.readline()
  67.         if not line:
  68.             break
  69.         outline = []
  70.         stripped = ''
  71.         if line[-1:] == '\n':
  72.             line = line[:-1]
  73.             stripped = '\n'
  74.         for c in line:
  75.             if needsquoting(c, quotetabs, header):
  76.                 c = quote(c)
  77.             if header and c == ' ':
  78.                 outline.append('_')
  79.                 continue
  80.             outline.append(c)
  81.         
  82.         if prevline is not None:
  83.             write(prevline)
  84.         thisline = EMPTYSTRING.join(outline)
  85.         while len(thisline) > MAXLINESIZE:
  86.             write(thisline[:MAXLINESIZE - 1], lineEnd = '=\n')
  87.             thisline = thisline[MAXLINESIZE - 1:]
  88.         prevline = thisline
  89.         continue
  90.         if prevline is not None:
  91.             write(prevline, lineEnd = stripped)
  92.         return None
  93.  
  94.  
  95. def encodestring(s, quotetabs = 0, header = 0):
  96.     if b2a_qp is not None:
  97.         return b2a_qp(s, quotetabs = quotetabs, header = header)
  98.     StringIO = StringIO
  99.     import cStringIO
  100.     infp = StringIO(s)
  101.     outfp = StringIO()
  102.     encode(infp, outfp, quotetabs, header)
  103.     return outfp.getvalue()
  104.  
  105.  
  106. def decode(input, output, header = 0):
  107.     """Read 'input', apply quoted-printable decoding, and write to 'output'.
  108.     'input' and 'output' are files with readline() and write() methods.
  109.     If 'header' is true, decode underscore as space (per RFC 1522)."""
  110.     if a2b_qp is not None:
  111.         data = input.read()
  112.         odata = a2b_qp(data, header = header)
  113.         output.write(odata)
  114.         return None
  115.     new = None
  116.     while None:
  117.         line = input.readline()
  118.         if not line:
  119.             break
  120.         i = 0
  121.         n = len(line)
  122.         if n > 0 and line[n - 1] == '\n':
  123.             partial = 0
  124.             n = n - 1
  125.             while n > 0 and line[n - 1] in ' \t\r':
  126.                 n = n - 1
  127.         else:
  128.             partial = 1
  129.         while i < n:
  130.             c = line[i]
  131.             if c == '_' and header:
  132.                 new = new + ' '
  133.                 i = i + 1
  134.                 continue
  135.             if c != ESCAPE:
  136.                 new = new + c
  137.                 i = i + 1
  138.                 continue
  139.             if i + 1 == n and not partial:
  140.                 partial = 1
  141.                 break
  142.                 continue
  143.             if i + 1 < n and line[i + 1] == ESCAPE:
  144.                 new = new + ESCAPE
  145.                 i = i + 2
  146.                 continue
  147.             if i + 2 < n and ishex(line[i + 1]) and ishex(line[i + 2]):
  148.                 new = new + chr(unhex(line[i + 1:i + 3]))
  149.                 i = i + 3
  150.                 continue
  151.             new = new + c
  152.             i = i + 1
  153.         if not partial:
  154.             output.write(new + '\n')
  155.             new = ''
  156.             continue
  157.             continue
  158.             if new:
  159.                 output.write(new)
  160.             return None
  161.  
  162.  
  163. def decodestring(s, header = 0):
  164.     if a2b_qp is not None:
  165.         return a2b_qp(s, header = header)
  166.     StringIO = StringIO
  167.     import cStringIO
  168.     infp = StringIO(s)
  169.     outfp = StringIO()
  170.     decode(infp, outfp, header = header)
  171.     return outfp.getvalue()
  172.  
  173.  
  174. def ishex(c):
  175.     """Return true if the character 'c' is a hexadecimal digit."""
  176.     return c <= 'f' if c <= c else 'A' if c <= c else c
  177.  
  178.  
  179. def unhex(s):
  180.     '''Get the integer value of a hexadecimal number.'''
  181.     bits = 0
  182.     for c in s:
  183.         if c <= c:
  184.             pass
  185.         elif c <= '9':
  186.             i = ord('0')
  187.         elif c <= c:
  188.             pass
  189.         elif c <= c <= 'f':
  190.             i = ord('a') - 10
  191.         elif c <= c:
  192.             pass
  193.         elif c <= c <= 'F':
  194.             i = ord('A') - 10
  195.         else:
  196.             break
  197.         bits = bits * 16 + (ord(c) - i)
  198.     
  199.     return bits
  200.  
  201.  
  202. def main():
  203.     import sys as sys
  204.     import getopt as getopt
  205.     
  206.     try:
  207.         (opts, args) = getopt.getopt(sys.argv[1:], 'td')
  208.     except getopt.error:
  209.         msg = None
  210.         sys.stdout = sys.stderr
  211.         print msg
  212.         print 'usage: quopri [-t | -d] [file] ...'
  213.         print '-t: quote tabs'
  214.         print '-d: decode; default encode'
  215.         sys.exit(2)
  216.  
  217.     deco = 0
  218.     tabs = 0
  219.     for o, a in opts:
  220.         if o == '-t':
  221.             tabs = 1
  222.         if o == '-d':
  223.             deco = 1
  224.             continue
  225.     if tabs and deco:
  226.         sys.stdout = sys.stderr
  227.         print '-t and -d are mutually exclusive'
  228.         sys.exit(2)
  229.     if not args:
  230.         args = [
  231.             '-']
  232.     sts = 0
  233.     for file in args:
  234.         if file == '-':
  235.             fp = sys.stdin
  236.         else:
  237.             
  238.             try:
  239.                 fp = open(file)
  240.             except IOError:
  241.                 msg = None
  242.                 sys.stderr.write("%s: can't open (%s)\n" % (file, msg))
  243.                 sts = 1
  244.                 continue
  245.  
  246.         if deco:
  247.             decode(fp, sys.stdout)
  248.         else:
  249.             encode(fp, sys.stdout, tabs)
  250.         if fp is not sys.stdin:
  251.             fp.close()
  252.             continue
  253.     if sts:
  254.         sys.exit(sts)
  255.  
  256. if __name__ == '__main__':
  257.     main()
  258.